home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Linux Cubed Series 2: Applications
/
Linux Cubed Series 2 - Applications.iso
/
circuits
/
irsim-ca.2
/
irsim-ca
/
irsim-cap-9.2
/
src
/
ana11
/
wm.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-15
|
8KB
|
299 lines
/*
* *********************************************************************
* * Copyright (C) 1988, 1990 Stanford University. *
* * Permission to use, copy, modify, and distribute this *
* * software and its documentation for any purpose and without *
* * fee is hereby granted, provided that the above copyright *
* * notice appear in all copies. Stanford University *
* * makes no representations about the suitability of this *
* * software for any purpose. It is provided "as is" without *
* * express or implied warranty. Export of this software outside *
* * of the United States of America may require an export license. *
* *********************************************************************
*/
#include <stdio.h>
#include "ana.h"
#include "ana_glob.h"
#include "X11/Xutil.h"
public void GetWindowGeometry( w, x, y, width, height, border )
Window w;
Coord *x, *y, *width, *height;
int *border;
{
Window root, subw;
int d;
XGetGeometry( display, w, &subw, x, y, width, height, border, &d );
root = RootWindowOfScreen( screen );
d = -(*border);
XTranslateCoordinates( display, w, root, d, d, x, y, &subw );
}
public void GrabMouse( w, ev_mask, cursor )
Window w;
unsigned long ev_mask;
Cursor cursor;
{
while( XGrabPointer( display, w, False, ev_mask, GrabModeAsync,
GrabModeAsync, None, cursor, CurrentTime ) != GrabSuccess );
}
private int GetMotionEvent( w, ev, x, y )
Window w;
XEvent *ev;
Coord *x, *y;
{
int n, mask;
Coord rx, ry;
Window root, subw;
for( n = XPending( display ); n != 0; n-- )
{
XNextEvent( display, ev );
if( ev->type == ButtonPress or ev->type == ButtonRelease )
return( FALSE );
}
XQueryPointer( display, w, &root, &subw, &rx, &ry, x, y, &mask );
return( TRUE );
}
private void MoveOutline( wind, x1, y1, x2, y2 )
Window wind;
Coord x1, y1, x2, y2;
{
static Coord oldx1 = 0;
static Coord oldy1 = 0;
static Coord oldx2 = 0;
static Coord oldy2 = 0;
Coord x3, x2_3, y3, y2_3;
XSegment outline[16];
XSegment *s;
int nseg = 0;
if( x1 == oldx1 and x2 == oldx2 and y1 == oldy1 and y2 == oldy2 )
return;
s = outline;
nseg = 0;
if( oldx1 != oldx2 and oldy1 != oldy2 )
{
x3 = (oldx2 - oldx1)/3;
x2_3 = oldx1 + x3 + x3;
x3 += oldx1;
y3 = (oldy2 - oldy1)/3;
y2_3 = oldy1 + y3 + y3;
y3 += oldy1;
s[0].x1 = oldx1; s[0].y1 = oldy1; s[0].x2 = oldx2; s[0].y2 = oldy1;
s[1].x1 = oldx2; s[1].y1 = oldy1; s[1].x2 = oldx2; s[1].y2 = oldy2;
s[2].x1 = oldx1; s[2].y1 = oldy2; s[2].x2 = oldx2; s[2].y2 = oldy2;
s[3].x1 = oldx1; s[3].y1 = oldy1; s[3].x2 = oldx1; s[3].y2 = oldy2;
s[4].x1 = oldx1; s[4].y1 = y3; s[4].x2 = oldx2; s[4].y2 = y3;
s[5].x1 = oldx1; s[5].y1 = y2_3; s[5].x2 = oldx2; s[5].y2 = y2_3;
s[6].x1 = x3; s[6].y1 = oldy1; s[6].x2 = x3; s[6].y2 = oldy2;
s[7].x1 = x2_3; s[7].y1 = oldy1; s[7].x2 = x2_3; s[7].y2 = oldy2;
s += 8;
nseg += 8;
}
if( x1 != x2 and y1 != y2 )
{
x3 = (x2 - x1)/3;
x2_3 = x1 + x3 + x3;
x3 += x1;
y3 = (y2 - y1)/3;
y2_3 = y1 + y3 + y3;
y3 += y1;
s[0].x1 = x1; s[0].y1 = y1; s[0].x2 = x2; s[0].y2 = y1;
s[1].x1 = x2; s[1].y1 = y1; s[1].x2 = x2; s[1].y2 = y2;
s[2].x1 = x1; s[2].y1 = y2; s[2].x2 = x2; s[2].y2 = y2;
s[3].x1 = x1; s[3].y1 = y1; s[3].x2 = x1; s[3].y2 = y2;
s[4].x1 = x1; s[4].y1 = y3; s[4].x2 = x2; s[4].y2 = y3;
s[5].x1 = x1; s[5].y1 = y2_3; s[5].x2 = x2; s[5].y2 = y2_3;
s[6].x1 = x3; s[6].y1 = y1; s[6].x2 = x3; s[6].y2 = y2;
s[7].x1 = x2_3; s[7].y1 = y1; s[7].x2 = x2_3; s[7].y2 = y2;
nseg += 8;
}
if( nseg != 0 )
XDrawSegments( display, wind, gcs.invert, outline, nseg );
oldx1 = x1;
oldx2 = x2;
oldy1 = y1;
oldy2 = y2;
}
public void ResizeMe()
{
Window root;
Coord left, top, right, bot, width, height;
Coord lim_left, lim_right, lim_top, lim_bot;
Coord x, y, w, h, min_w, min_h, ox, oy;
int border, d;
XEvent ev;
XSizeHints shint;
GetWindowGeometry( window, &left, &top, &width, &height, &border );
border *= 2;
right = left + width + border - 1;
bot = top + height + border - 1;
GetMinWsize( &min_w, &min_h );
min_w += border;
min_h += border;
w = min_w / 2;
h = min_h / 2;
lim_left = left + w;
lim_right = right - w;
lim_top = top + h;
lim_bot = bot - h;
root = RootWindowOfScreen( screen );
XGrabServer( display );
GrabMouse( root, ButtonPressMask | ButtonReleaseMask, cursors.move );
ev.type = MotionNotify;
w = width + border;
h = height + border;
ox = left; oy = bot;
while( GetMotionEvent( root, &ev, &x, &y ) )
{
if( x < lim_left )
ox = right;
else if( x > lim_right )
ox = left;
if( y < lim_top )
oy = bot;
else if( y > lim_bot )
oy = top;
w = x - ox;
if( w < 0 )
{
w = 1 - w;
if( w < min_w )
w = min_w;
x = ox - w + 1;
}
else
{
w += 1;
if( w < min_w )
w = min_w;
x = ox + w - 1;
}
h = y - oy;
if( h < 0 )
{
h = 1 - h;
if( h < min_h )
h = min_h;
y = oy - h + 1;
}
else
{
h += 1;
if( h < min_h )
h = min_h;
y = oy + h - 1;
}
MoveOutline( root, ox, oy, x, y );
}
MoveOutline( root, 0, 0, 0, 0 ); /* erase outline */
XUngrabPointer( display, CurrentTime );
XUngrabServer( display );
w -= border;
h -= border;
if( ev.type == ButtonPress or (w == width and h == height) )
return;
if( ox < x ) x = ox;
if( oy < y ) y = oy;
shint.x = x;
shint.y = y;
shint.width = w;
shint.height = h;
shint.max_width = shint.max_height = 16000;
shint.width_inc = shint.height_inc = 1;
GetMinWsize( &shint.min_width, &shint.min_height );
shint.flags = ( PMinSize | PMaxSize | PResizeInc | USPosition | USSize );
XSetNormalHints( display, window, &shint );
XMoveResizeWindow( display, window, x, y, w, h );
}
public void MoveMe( x, y )
Coord x, y;
{
Coord dx, dy;
Window root;
Coord top, left, w, h;
int border, d;
XEvent ev;
XSizeHints shint;
GetWindowGeometry( window, &left, &top, &w, &h, &border );
dx = x + border;
dy = y + border;
border *= 2;
w += border - 1;
h += border - 1;
root = RootWindowOfScreen( screen );
XGrabServer( display );
GrabMouse( root, ButtonReleaseMask | ButtonPressMask, cursors.move );
ev.type = MotionNotify;
x = left; y = top;
while( GetMotionEvent( root, &ev, &x, &y ) )
{
x -= dx;
y -= dy;
MoveOutline( root, x, y, x + w, y + h );
}
MoveOutline( root, 0, 0, 0, 0 );
XUngrabPointer( display, CurrentTime );
XUngrabServer( display );
if( ev.type == ButtonPress or (x == left and y == top) )
return;
shint.x = x;
shint.y = y;
shint.width = w - border + 1;
shint.height = h - border + 1;
shint.max_width = shint.max_height = 16000;
shint.width_inc = shint.height_inc = 1;
GetMinWsize( &shint.min_width, &shint.min_height );
shint.flags = ( PMinSize | PMaxSize | PResizeInc | USPosition | USSize );
XSetNormalHints( display, window, &shint );
XMoveWindow( display, window, x, y );
}
public void IconifyMe()
{
Coord x, y, ix, iy, w, h, b;
GetWindowGeometry( iconW, &ix, &iy, &w, &h, &b );
GetWindowGeometry( window, &x, &y, &w, &h, &b );
XDestroyWindow( display, window );
XDestroyWindow( display, iconW );
XFlush( display );
iconW = CreateIconWindow( ix, iy );
InitWindow( FALSE, IconicState, x, y, w, h, ix, iy );
XMapWindow( display, window );
}